import axios from 'axios'
import router from '@/router/index.js'
import { Toast } from 'vant'
import { getLocal, removeLocal } from '@/utils/auth.js'
const _axios = axios.create({
  baseURL: process.env.VUE_APP_URL
})

// 创建请求中断数组集合
let cancelArr = []
// 暴露请求中断
export function cancelAll () {
  cancelArr.forEach(item => {
    item.cancel()
  })
  cancelArr = []
}

// 请求拦截
_axios.interceptors.request.use(
  config => {
    // 判断是否重复请求，进行中断
    cancelArr = cancelArr.filter(item => {
      if (item.url === config.url && item.method === config.method) {
        item.cancel()
        return false
      } else {
        return true
      }
    })

    // 实例化请求中断
    config.cancelToken = new axios.CancelToken(cancel => {
      // 判断是否有get参数
      if (config.params) {
        cancelArr.push({
          url: config.url,
          method: config.method,
          params: config.params,
          cancel: cancel
        })
      } else {
        cancelArr.push({
          url: config.url,
          method: config.method,
          cancel: cancel
        })
      }
    })

    // 给需要token的接口添加token，不需要的添加了会报错
    if (config.needToken) {
      config.headers.authorization = `Bearer ${getLocal('userToken')}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截
_axios.interceptors.response.use(
  res => {
    // console.log('响应res:', res)
    if (res.data.code === 200) {
      return res.data
      // 可能还需要处理vuex的登录状态【待办】
    } else if (res.data.code === 401 || res.data.code === 403) {
      // 如果返回401或403,则删除token
      removeLocal('userToken')
      // Toast提示错误信息
      // Toast.fail(res.data.message)
      Toast.fail('请先登录')
      // 跳转到登录页
      router.push('/login')
      // 后这句不太理解,和eslint有关
      return Promise.reject(new Error(res.data.message))
    } else {
      Toast.fail(res.data.message)
      // 后这句不太理解,和eslint有关
      return Promise.reject(new Error(res.data.message))
    }
  },
  error => {
    console.log('响应error:', Promise.reject(error))
    return Promise.reject(error)
  }
)
// 暴露出去

export default _axios
